package sanrenxing.dayEnd.backRepertoryTotal.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import sanrenxing.dayEnd.backRepertoryTotal.dao.WorthStatisticsDao;
import sanrenxing.dayEnd.backRepertoryTotal.domain.WorthStatistics;
import sanrenxing.dayEnd.backRepertoryTotal.service.WorthStatisticsService;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * @authors name:邓志强
 * @descriptions:净值统计服务器类
 * @date: 2021/5/15 15:03
 * @version:1.0
 */
@Service("worthStatisticsService")
public class WorthStatisticsServiceImpl implements WorthStatisticsService {
    //注入净值统计dao对象
    @Autowired
    private WorthStatisticsDao worthStatisticsDao;

    /**
     * 查询所有统计的数据
     * @param limit 行数
     * @param page 页数
     * @return 返回统计数据
     */
    @Override
    public List<WorthStatistics> queryWorths(int limit, int page) {
        //获得总条数，结尾数据位置
        int end=limit*page;
        //获得开始显示数据的位置
        int start=(page-1)*limit;
        //返回调用查询方法，分别将结束位置和开始位置传入
        return worthStatisticsDao.queryWorth(end,start);
    }

    /**
     * 通过日期取出数据
     * @param date 日期
     * @return 返回统计数据
     */
    @Override
    public List<WorthStatistics> syt(String date) {
        //调用方法，通过日期取出数据
        return worthStatisticsDao.syt(date);
    }

    /**
     * 通过时间顺序查询出统计数据
     * @param date 日期
     * @return 返回统计数据
     */
    @Override
    public List<WorthStatistics> syts(String date) {
        //调用通过时间顺序查询数据的方法
        return worthStatisticsDao.syts(date);
    }

    /**
     * 统计行数
     * @return 返回统计行数
     */
    @Override
    public int count() {
        //调用统计行数打的发方法
        return worthStatisticsDao.count();
    }

    /**
     * 净值统计，统计所有数据插入到净值统计当中
     * @return 返回统计数据
     */
    @Override
    public Boolean total() {
        try {
            //计算总资产
            //从存款业务中取出已处理存款
            double deposit = worthStatisticsDao.depositGetTotalMoney();
            //从证券应收应付中取出流入数据
            double recInto = worthStatisticsDao.recGetIntoTotalMoney();
            //从现金应收应付中取出流入数据
            double cashInto = worthStatisticsDao.cashGetIntoTotalMoney();
            //从资金调拨中取出未处理流入数据:基金插入统计
            double fundInto = worthStatisticsDao.fundGetIntoTotalMoney();
            //从证券库存中取出总金额
            double reStockMoney = worthStatisticsDao.reStockTotalMoney();
            //从现金库存中取出总金额
            double cashStockMoney = worthStatisticsDao.cashStockTotalMoney();

            //从证券应收应付库存中取出增值估值的增值或贬值的数据
            double valuation = worthStatisticsDao.valuationTotalMoney();

            //从资金调拨中取出未处理流出数据
            double fundOut = worthStatisticsDao.fundGetOutTotalMoney();

            //算出总资产
            //定义日期变量
            String dates;
            //创建日期格式对象，得出当天日期保存到日期变量中
            dates = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
            //定义资产资产变量
            double totalAssets;
            //总资产等于如上资产流入之和，并且加上估值增值数据，如果大于零则取，如果小于零则取零
            totalAssets=deposit+recInto+cashInto+fundInto+reStockMoney+cashStockMoney+(valuation>0?valuation:0);
            //定义总负债变量
            double totalLiabulitys;
            //总负债等于流出数据之和，并且加上估值增值数据，如果小于零则取，反之赋零，取绝对值
            totalLiabulitys=fundOut+Math.abs(valuation<0?valuation:0);
            //定义资产净值变量
            double netAsset;
            //资产净值等于总资产减去总负债
            netAsset=totalAssets-totalLiabulitys;
            //单位净值
            //查询当前ta数量，定义长整型接收
            Long taNumber =worthStatisticsDao.queryTaNumber();
            //计算单位净值，等于总资产除以ta数量，使用正则表达式防止数量为空
            Double singleAssetValue=netAsset/(taNumber!=null?taNumber:1);
            //调用添加资产净值方法，将日期、总资产、总负债、资产净值、单位净值传入
            worthStatisticsDao.addTotal(dates,totalAssets,totalLiabulitys,netAsset,singleAssetValue);
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 得出基金总份额
     * @return 返回数量
     */
    @Override
    public Long shareNumber() {
        //调用方法，返回基金总份额
        return worthStatisticsDao.shareNumber();
    }

    /**
     * 批量删除净值统计数据
     * @return 返回删除条数
     */
    @Override
    public String monayDelete(String str) {
        try {
            //判断删除的数据当中是否包含都好
            if (str.trim().contains(",")){
                //如果包含则进行分割
                String[] strs=str.split(",");
                //遍历分割的数据
                for (String ss : strs) {
                    //调用删除方法，传入数据
                    worthStatisticsDao.delete(ss);
                }
            }
            //如果不包含逗号则传入参数直接删除
            worthStatisticsDao.delete(str);
            //返回成功
            return "success";
        }catch (Exception e){
            e.printStackTrace();
            return "fail";
        }
    }
}
